home *** CD-ROM | disk | FTP | other *** search
/ Nejlepší hry / Nejlepsi hry.iso / hry / plane arcade / planearcade.exe / tank3.bmp / zaloha / model-origina.cpp < prev    next >
C/C++ Source or Header  |  2004-09-18  |  50KB  |  1,860 lines

  1.  
  2. #include "main.h"
  3.  
  4. //------------------------------------------------------------------
  5. // Name: MODEL()
  6. // Desc: konstruktor
  7. //------------------------------------------------------------------
  8. MODEL::MODEL()
  9. {
  10.  
  11.     g_pVB      = NULL; 
  12.     g_pTexture = NULL;  
  13.     g_pEnviroMap = NULL; 
  14.  
  15.     ModelFrame = NULL;
  16.  
  17.     Color = GetColor(1.0f,1.0f,1.0f,1.0f);
  18.     Lighting = true ;
  19.     Specular = false ;
  20.     BumpMap = false;
  21.     EnviromentMapping = false;
  22.     MultiTexture = false; 
  23.     OnlyShadow = false;
  24.     Textured = true;
  25.     FrustrumTest = true;
  26.     SmoothShading = true;
  27.     Normals = true;
  28.     Frame = 0.0f;
  29.  
  30.     NumFrames = 0;
  31.     NumFaces = 0;
  32.  
  33.     Pos = Get3D(0.0f,0.0f,0.0f);
  34.     Rot = Get3D(0.0f,0.0f,0.0f);
  35.     Sca = Get3D(1.0f,1.0f,1.0f);
  36. }
  37.  
  38.  
  39. //------------------------------------------------------------------
  40. // Name: ~MODEL()
  41. // Desc: destruktor
  42. //------------------------------------------------------------------
  43. MODEL::~MODEL()
  44. {
  45.  
  46.     if (g_pTexture != NULL)
  47.         g_pTexture->Release();
  48.     g_pTexture = NULL;
  49.  
  50.     if (g_pEnviroMap != NULL)
  51.         g_pEnviroMap->Release();
  52.     g_pEnviroMap = NULL;
  53.  
  54.     if (g_pVB != NULL)
  55.         g_pVB->Release();
  56.     g_pVB = NULL;
  57.  
  58.     //znic pomocny model
  59.     DestroyModel(&ModelT);
  60.  
  61.     //znic zasobnik modelov
  62.     for (int i = 0;i<NumFrames;i++)
  63.     {
  64.         DestroyModel(&ModelFrame[i]);
  65.     }
  66.  
  67.     if (ModelFrame != NULL)
  68.         delete [] ModelFrame;
  69.     ModelFrame = NULL;
  70.  
  71. }
  72.  
  73. //------------------------------------------------------------------
  74. // Name: DestroyModel()
  75. // Desc: Znic model
  76. //------------------------------------------------------------------
  77. void MODEL::DestroyModel(MODELFRAME *Mod)
  78. {
  79.  
  80.     if (Mod->FaceList != NULL)
  81.         delete [] Mod->FaceList;
  82.     Mod->FaceList = NULL;
  83.     
  84. }
  85.  
  86. //------------------------------------------------------------------
  87. // Name: InitializeModel()
  88. // Desc: inicializuj model podla poctu trojholnikov
  89. //------------------------------------------------------------------
  90. void MODEL::InitializeModel(MODELFRAME *Mod,int NFaces)
  91. {
  92.     Mod->FaceList = new MODELFACE[NFaces];
  93.     Mod->NumFaces = NFaces;
  94.     Mod->ActFace = 0;
  95.  
  96.     Mod->Centre = Get3D(0.0f,0.0f,0.0f);
  97. }
  98.  
  99. //------------------------------------------------------------------
  100. // Name: GetNumFace()
  101. // Desc: Zisti pocet Face z Ase suboru
  102. //------------------------------------------------------------------
  103. int MODEL::GetNumFace(char *FileName)
  104. {
  105.     FILE *fp;
  106.     char cBuf[80]; 
  107.     int Vys = 0;
  108.     int Pom = 0;
  109.  
  110.     fp = fopen(FileName,"r");
  111.  
  112.     if (fp == NULL)
  113.     {
  114.         sprintf(cBuf,"  Nenasiel som subor %s",FileName);
  115.         LogPrint(cBuf);
  116.     }
  117.  
  118.     while(!feof(fp))
  119.     {
  120.         fscanf(fp,"%s",cBuf);
  121.  
  122.         if (strcmp("*MESH_NUMFACES",cBuf) == 0)
  123.         {
  124.             fscanf(fp,"%d",&Pom);
  125.             Vys = Vys + Pom;
  126.         }
  127.         
  128.     }
  129.  
  130.     fclose(fp);
  131.  
  132.     return Vys;
  133. }
  134.  
  135.  
  136. //------------------------------------------------------------------
  137. // Name: InitializeAse()
  138. // Desc: zinicializuje polia podla Ase modelu
  139. //------------------------------------------------------------------
  140. void MODEL::InitializeAse(int NFrames,char *FileName)
  141. {
  142.  
  143.     char cBuf[80];
  144.     LogPrint("Inicializujem ASE model");
  145.  
  146.     //nacita pocet trojholnikov z Ase suboru
  147.     NumFrames = NFrames;
  148.     NumFaces = GetNumFace(FileName);
  149.     
  150.     sprintf(cBuf,"  NumFrames: %d",NumFrames);
  151.     LogPrint(cBuf);
  152.     sprintf(cBuf,"  NumFaces: %d",NumFaces);
  153.     LogPrint(cBuf);
  154.  
  155.     //vytvori zasobnik modelov
  156.     ModelFrame = new MODELFRAME [NFrames];
  157.  
  158.     //inicializuje zasobnik modelov
  159.     for (int i=0;i<NFrames;i++)
  160.     {
  161.         InitializeModel(&ModelFrame[i],NumFaces);
  162.     }
  163.  
  164.     //inicializuje transformovany model
  165.     InitializeModel(&ModelT,NumFaces);
  166.  
  167.     //vytvaranie vertex buffera
  168.     if (FAILED(g_pd3dDevice->CreateVertexBuffer(NumFaces*3*sizeof(CUSTOMVERTEXMODEL),
  169.                                    D3DUSAGE_WRITEONLY|D3DUSAGE_DYNAMIC, D3DFVF_CUSTOMVERTEXMODEL,
  170.                                    D3DPOOL_DEFAULT, &g_pVB, NULL )))
  171.       {
  172.         LogPrint("  Chyba pri vytvarani VB");
  173.     }
  174.     else
  175.     {
  176.         LogPrint("  Vertex Buffer vytvoreny");
  177.     }
  178.  
  179.     
  180. }
  181.  
  182.  
  183. //------------------------------------------------------------------
  184. // Name: LoadAse()
  185. // Desc: loadne ase model
  186. //------------------------------------------------------------------
  187. void MODEL::LoadAse(int IntoFrame,char *FileName)
  188. {
  189.  
  190.  
  191.     FILE *fp;     //subor
  192.     char cBuf[80]; //nacitavanie
  193.  
  194.     fp = fopen(FileName,"r");
  195.  
  196.     if (fp == NULL)
  197.     {
  198.         sprintf(cBuf,"  Nenasiel som subor %s",FileName);
  199.         LogPrint(cBuf);
  200.     }
  201.  
  202.     //ak narazis na GEOMOBJECT nacitaj node
  203.     while(!feof(fp))
  204.     {
  205.         fscanf(fp,"%s",cBuf);
  206.         
  207.         //----------------*GEOMOBJECT----------------
  208.         if (strcmp(cBuf,"*GEOMOBJECT") == 0)
  209.         {
  210.             AddNode(&ModelFrame[IntoFrame],fp);
  211.         }
  212.  
  213.         strcpy(cBuf,"");
  214.  
  215.     }
  216.  
  217.     fclose(fp);
  218.  
  219.     //vypocitajminmax
  220.     CalcBoxPoints(&ModelFrame[IntoFrame]);
  221.  
  222.     //vypocitaj normaly
  223.     if (Normals == true)
  224.         CalcFaceNormals(&ModelFrame[IntoFrame]);
  225.  
  226.     //vypocitaj smooth shading
  227.     if (SmoothShading == true)
  228.         CalcSmoothShading(&ModelFrame[IntoFrame]);
  229.  
  230. }
  231.  
  232.  
  233. //------------------------------------------------------------------
  234. // Name: AddNode()
  235. // Desc: prida do modelu geom objekt
  236. //------------------------------------------------------------------
  237. void MODEL::AddNode(MODELFRAME *Mod,FILE *fp)
  238. {
  239.  
  240.     //zasobniky vertexov
  241.     VECTOR3D *V = NULL;
  242.     VECTOR3D *T = NULL;
  243.  
  244.     char cBuf[80]; //nacitavanie
  245.  
  246.     int NumV;  //pocet vertexov
  247.     int NumT;  //pocet texture vertexov   
  248.     int NumF;  //pocet facov
  249.  
  250.     D3DXMATRIX RotationMatrix;
  251.     D3DXVECTOR3 RotVector;
  252.     float RotAngle;
  253.  
  254.     while(1==1)
  255.     {
  256.         //nacitaj retazec
  257.         fscanf(fp,"%s",cBuf);
  258.  
  259.         //-----------*TM_ROTAXIS---------------- 
  260.         if (strcmp(cBuf,"*TM_ROTAXIS") == 0)
  261.         {
  262.             fscanf(fp,"%f %f %f",&RotVector.x,&RotVector.z,&RotVector.y);    
  263.         }
  264.  
  265.         //-----------*TM_ROTANGLE---------------
  266.         if (strcmp(cBuf,"*TM_ROTANGLE") == 0)
  267.         {
  268.             fscanf(fp,"%f",&RotAngle);    
  269.  
  270.             //vypocita maticu rotacie
  271.             D3DXMatrixIdentity(&RotationMatrix);     
  272.             D3DXMatrixRotationAxis(&RotationMatrix,&RotVector,RotAngle);
  273.         }
  274.  
  275.         //-----------*MESH_NUMVERTEX------------
  276.         if (strcmp(cBuf,"*MESH_NUMVERTEX") == 0)
  277.         {
  278.             fscanf(fp,"%d",&NumV);    
  279.             V = new VECTOR3D[NumV];
  280.         }
  281.  
  282.         //-----------*MESH_NUMTVERTEX------------
  283.         if (strcmp(cBuf,"*MESH_NUMTVERTEX") == 0)
  284.         {
  285.             fscanf(fp,"%d",&NumT);    
  286.             T = new VECTOR3D[NumT];
  287.         }
  288.         //-----------*MESH_NUMFACES-------------
  289.         if (strcmp(cBuf,"*MESH_NUMFACES") == 0)
  290.         {
  291.             fscanf(fp,"%d",&NumF);    
  292.         }
  293.  
  294.         //-----------*MESH_VERTEX---------------
  295.         if (strcmp(cBuf,"*MESH_VERTEX") == 0)
  296.         {
  297.             int Id;
  298.             float Xs, Ys, Zs;
  299.  
  300.             fscanf(fp,"%d %f %f %f",&Id,&Xs,&Zs,&Ys);
  301.             
  302.             V[Id] = Get3D(Xs,Ys,Zs);
  303.  
  304.         }
  305.  
  306.         //-----------*MESH_FACE-----------------
  307.         if (strcmp(cBuf,"*MESH_FACE") == 0)
  308.         {
  309.             int Id = Mod->ActFace;
  310.  
  311.             int V1,V2,V3;
  312.  
  313.             fscanf(fp,"%s %s %d %s %d %s %d",cBuf,cBuf,&V1,cBuf,&V2,cBuf,&V3);
  314.         
  315.             Mod->FaceList[Id].P[0] = V[V3];
  316.             Mod->FaceList[Id].P[1] = V[V2];
  317.             Mod->FaceList[Id].P[2] = V[V1];
  318.  
  319.             Mod->ActFace = Mod->ActFace + 1;
  320.     
  321.         }
  322.         //-----------*MESH_TVERT----------------
  323.         if (strcmp(cBuf,"*MESH_TVERT") == 0)
  324.         {
  325.             int Idf;
  326.             float Xs, Ys, Zs;
  327.  
  328.             fscanf(fp,"%d %f %f %f",&Idf,&Xs,&Ys,&Zs);
  329.  
  330.             T[Idf] = Get3D(Xs,-Ys,Zs);
  331.                     
  332.         }
  333.         //-----------*MESH_TFACE----------------
  334.         if (strcmp(cBuf,"*MESH_TFACE") == 0)
  335.         {
  336.             int Id = Mod->ActFace;
  337.         
  338.             int Idf; 
  339.             int V1,V2,V3;
  340.  
  341.             fscanf(fp,"%d %d %d %d",&Idf,&V1,&V2,&V3);
  342.     
  343.             Mod->FaceList[Id - NumF + Idf].T[0].X = T[V3].X;
  344.             Mod->FaceList[Id - NumF + Idf].T[0].Y = T[V3].Y;
  345.         
  346.             Mod->FaceList[Id - NumF + Idf].T[1].X = T[V2].X;
  347.             Mod->FaceList[Id - NumF + Idf].T[1].Y = T[V2].Y;
  348.             
  349.             Mod->FaceList[Id - NumF + Idf].T[2].X = T[V1].X;
  350.             Mod->FaceList[Id - NumF + Idf].T[2].Y = T[V1].Y;
  351.  
  352.         }
  353.  
  354.         //---------*MESH_FACENORMAL----------------
  355.         if (strcmp(cBuf,"*MESH_FACENORMAL") == 0)
  356.         {
  357.             
  358.             float X,Y,Z;
  359.             int Id ;
  360.             int VId;
  361.  
  362.             fscanf(fp,"%d",&Id);
  363.             Id = Mod->ActFace-NumF+Id;
  364.  
  365.             fscanf(fp,"%d %f %f %f",&VId,&X,&Z,&Y);
  366.             
  367.             //v0
  368.             fscanf(fp,"%s %d %f %f %f %f",cBuf,&VId,&X,&Z,&Y);
  369.             Mod->FaceList[Id].N[2] = Get3D(X,Y,Z);
  370.             Mod->FaceList[Id].N[2] = TransformNormal(Mod->FaceList[Id].N[2], RotationMatrix);
  371.  
  372.             //v1
  373.             fscanf(fp,"%s %d %f %f %f %f",cBuf,&VId,&X,&Z,&Y);
  374.             Mod->FaceList[Id].N[1] = Get3D(X,Y,Z);
  375.             Mod->FaceList[Id].N[1] = TransformNormal(Mod->FaceList[Id].N[1], RotationMatrix);
  376.  
  377.             //v2
  378.             fscanf(fp,"%s %d %f %f %f %f",cBuf,&VId,&X,&Z,&Y);
  379.             Mod->FaceList[Id].N[0] = Get3D(X,Y,Z);
  380.             Mod->FaceList[Id].N[0] = TransformNormal(Mod->FaceList[Id].N[0], RotationMatrix);
  381.  
  382.             //plane
  383.             VECTOR3D N,V1,V2;
  384.             Sub(&V1,Mod->FaceList[Id].P[0],Mod->FaceList[Id].P[1]);
  385.             Sub(&V2,Mod->FaceList[Id].P[2],Mod->FaceList[Id].P[1]);
  386.             Cross(&N,V1,V2);
  387.             Normalize(&N);
  388.  
  389.             Mod->FaceList[Id].Plane.Normal = N;
  390.             Mod->FaceList[Id].Plane.D = -(N.X * Mod->FaceList[Id].P[1].X) 
  391.                                         -(N.Y * Mod->FaceList[Id].P[1].Y)
  392.                                         -(N.Z * Mod->FaceList[Id].P[1].Z);
  393.  
  394.     
  395.         }
  396.  
  397.         //-----------END GEOM OBJ--------------
  398.         if (strcmp(cBuf,"*PROP_MOTIONBLUR") == 0)
  399.         {
  400.             break;
  401.         }
  402.  
  403.         
  404.  
  405.  
  406.     }
  407.  
  408.     if (V != NULL)
  409.         delete [] V;
  410.  
  411.     if (T != NULL)
  412.         delete [] T;
  413.  
  414. }
  415.  
  416.  
  417. //------------------------------------------------------------------
  418. // Name: LoadTexture()
  419. // Desc: Loadne texturu
  420. //------------------------------------------------------------------
  421. void MODEL::LoadTexture(char *FileName,COLOR ColorKey)
  422. {
  423.  
  424.     char cBuf[80];
  425.  
  426.     sprintf(cBuf,"  Textura: %s",FileName);
  427.     LogPrint(cBuf);
  428.     
  429.     if (FAILED(D3DXCreateTextureFromFileEx(g_pd3dDevice, 
  430.                                   FileName,    
  431.                                   D3DX_DEFAULT, 
  432.                                   D3DX_DEFAULT, 
  433.                                   Engine.MipMapLevels,   //MipLevels
  434.                                   0,            
  435.                                   Engine.TextureFormat, 
  436.                                   D3DPOOL_DEFAULT,
  437.                                   D3DX_DEFAULT, //Filter
  438.                                   D3DX_DEFAULT, //MipFilter
  439.                                   D3DXCOLOR    (ColorKey.R,
  440.                                                 ColorKey.G,
  441.                                                 ColorKey.B,
  442.                                                 ColorKey.A),   //ColourKey
  443.                                   NULL,         
  444.                                   NULL,         
  445.                                   &g_pTexture)))  
  446.     {
  447.         sprintf(cBuf,"  chyba pri vytvarani textury: %s",FileName);
  448.         LogPrint(cBuf);
  449.     }
  450.     else
  451.     {
  452.         LogPrint("  Textura modelu vytvorena");
  453.     }    
  454.  
  455. }
  456.  
  457. //------------------------------------------------------------------
  458. // Name: LoadTexture()
  459. // Desc: Loadne texturu
  460. //------------------------------------------------------------------
  461. void MODEL::LoadEnviroMap(char *FileName)
  462. {
  463.  
  464.     char cBuf[80];
  465.  
  466.     sprintf(cBuf,"  Enviroment Textura: %s",FileName);
  467.     LogPrint(cBuf);
  468.     
  469.     if (FAILED(D3DXCreateTextureFromFileEx(g_pd3dDevice, 
  470.                                   FileName,    
  471.                                   D3DX_DEFAULT, 
  472.                                   D3DX_DEFAULT, 
  473.                                   Engine.MipMapLevels,   //MipLevels
  474.                                   0,            
  475.                                   Engine.TextureFormat, 
  476.                                   D3DPOOL_DEFAULT,
  477.                                   D3DX_DEFAULT, //Filter
  478.                                   D3DX_DEFAULT, //MipFilter
  479.                                   0,   //ColourKey
  480.                                   NULL,         
  481.                                   NULL,         
  482.                                   &g_pEnviroMap)))  
  483.     {
  484.         sprintf(cBuf,"  chyba pri vytvarani Enviroment Textury: %s",FileName);
  485.         LogPrint(cBuf);
  486.     }
  487.     else
  488.     {
  489.         LogPrint("  Enviroment Textura modelu vytvorena");
  490.     }    
  491.  
  492. }
  493.  
  494.  
  495. //------------------------------------------------------------------
  496. // Name: RenderModelNormal()
  497. // Desc: Ulozi model do Vertex pola + vyrenderuje normalne
  498. //------------------------------------------------------------------
  499. void MODEL::RenderModelNormal(MODELFRAME Mod)
  500. {
  501.     
  502.     int ActVertex = 0;
  503.  
  504.     //pomocne
  505.     int u,i;
  506.     
  507.     //Vertex do ktoreho sa uklada
  508.     CUSTOMVERTEXMODEL *Vertex;
  509.  
  510.     //Otvor VB
  511.     g_pVB->Lock(0, 0, (void**)&Vertex,D3DLOCK_DISCARD|D3DLOCK_NOOVERWRITE ) ;
  512.  
  513.     //zobrazi model do pola vertexov
  514.     for (i = 0;i<NumFaces;i++)
  515.     {
  516.         for (u=0;u<3;u++)
  517.         {
  518.  
  519.             Vertex[ActVertex].pos.x = Mod.FaceList[i].P[u].X;
  520.             Vertex[ActVertex].pos.y = Mod.FaceList[i].P[u].Y;
  521.             Vertex[ActVertex].pos.z = Mod.FaceList[i].P[u].Z;
  522.  
  523.             Vertex[ActVertex].normal.x = Mod.FaceList[i].N[u].X;
  524.             Vertex[ActVertex].normal.y = Mod.FaceList[i].N[u].Y;
  525.             Vertex[ActVertex].normal.z = Mod.FaceList[i].N[u].Z;
  526.         
  527.             Vertex[ActVertex].tu = Mod.FaceList[i].T[u].X;
  528.             Vertex[ActVertex].tv = Mod.FaceList[i].T[u].Y;
  529.         
  530.             Vertex[ActVertex].color = D3DXCOLOR(Color.R,
  531.                                                 Color.G,
  532.                                                 Color.B,
  533.                                                 Color.A);
  534.  
  535. /*            
  536.         DebugDrawLine(Mod.FaceList[i].P[u],Get3D(Mod.FaceList[i].P[u].X+13*Mod.FaceList[i].N[u].X,
  537.                                                      Mod.FaceList[i].P[u].Y+13*Mod.FaceList[i].N[u].Y,
  538.                                                      Mod.FaceList[i].P[u].Z+13*Mod.FaceList[i].N[u].Z));
  539. */    
  540.             ActVertex = ActVertex + 1;                
  541.         }    
  542.  
  543.     }
  544.  
  545.  
  546.     //uzavri VB
  547.     g_pVB->Unlock() ;
  548.  
  549.     //
  550.     //TEXTURED
  551.     //
  552.     if (Textured == true)
  553.     {
  554.         g_pd3dDevice->SetTexture( 0, g_pTexture );
  555.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  556.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  557.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  558.     }
  559.     else
  560.     {
  561.         g_pd3dDevice->SetTexture( 0, g_pTexture );
  562.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
  563.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  564.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  565.     }
  566.  
  567.     
  568.  
  569.     //nastav material
  570.     g_pd3dDevice->SetMaterial(&Material);
  571.  
  572.     //zapni vypni svetla
  573.     Engine.SetLighting(Lighting);
  574.  
  575.     //zapni specular ak je zapnuty
  576.     Engine.SetSpecular(Specular);
  577.  
  578.     //zapni dx back face culling
  579.     Engine.SetCullMode(D3DCULL_CCW);
  580.  
  581.     //renderuje z VB
  582.     g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEXMODEL));
  583.     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEXMODEL);
  584.     g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, NumFaces);
  585.             
  586.     //reset to default
  587.     Engine.ResetToDefault();
  588.  
  589.     
  590. }
  591.  
  592. //------------------------------------------------------------------
  593. // Name: RenderModelOnlyShadow()
  594. // Desc: Ulozi model do Vertex pola + iba pre tien
  595. //------------------------------------------------------------------
  596. void MODEL::RenderModelOnlyShadow(MODELFRAME Mod)
  597. {
  598.     
  599.     int ActVertex = 0;
  600.  
  601.     //
  602.     //TEXTURED
  603.     //
  604.     if (Textured == true)
  605.     {
  606.         g_pd3dDevice->SetTexture( 0, g_pTexture );
  607.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  608.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  609.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  610.     }
  611.     else
  612.     {
  613.         g_pd3dDevice->SetTexture( 0, g_pTexture );
  614.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
  615.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  616.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  617.     }
  618.  
  619.     //reset to default
  620.     Engine.ResetToDefault();
  621.  
  622.     
  623. }
  624.  
  625. //------------------------------------------------------------------
  626. // Name: RenderModelEnvironment()
  627. // Desc: Ulozi model do Vertex pola + vyrenderuje cez enviro mapping
  628. //------------------------------------------------------------------
  629. void MODEL::RenderModelEnvironment(MODELFRAME Mod)
  630. {
  631.     
  632.     int ActVertex = 0;
  633.  
  634.     //pomocne
  635.     VECTOR3D P,N;
  636.     int u,i;
  637.     
  638.     //Vertex do ktoreho sa uklada
  639.     CUSTOMVERTEXMODEL *Vertex;
  640.  
  641.     //Otvor VB
  642.     g_pVB->Lock(0, 0, (void**)&Vertex, D3DLOCK_DISCARD|D3DLOCK_NOOVERWRITE ) ;
  643.  
  644.     //zobrazi model do pola vertexov
  645.     for (i = 0;i<NumFaces;i++)
  646.     {
  647.         for (u=0;u<3;u++)
  648.         {
  649.  
  650.             Vertex[ActVertex].pos.x = Mod.FaceList[i].P[u].X;
  651.             Vertex[ActVertex].pos.y = Mod.FaceList[i].P[u].Y;
  652.             Vertex[ActVertex].pos.z = Mod.FaceList[i].P[u].Z;
  653.  
  654.             Vertex[ActVertex].normal.x = Mod.FaceList[i].N[u].X;
  655.             Vertex[ActVertex].normal.y = Mod.FaceList[i].N[u].Y;
  656.             Vertex[ActVertex].normal.z = Mod.FaceList[i].N[u].Z;
  657.         
  658.             Vertex[ActVertex].tu = Mod.FaceList[i].T[u].X;
  659.             Vertex[ActVertex].tv = Mod.FaceList[i].T[u].Y;
  660.         
  661.             Vertex[ActVertex].color = D3DXCOLOR(Color.R,
  662.                                                 Color.G,
  663.                                                 Color.B,
  664.                                                 Color.A);
  665.  
  666.             //////////////////////
  667.             //ENVIROMENT MAPPING//
  668.             //////////////////////
  669.             P = TransformPoint(Mod.FaceList[i].P[u],Matica);
  670.             N = TransformNormal(Mod.FaceList[i].N[u],Matica);
  671.  
  672.             Mod.FaceList[i].T[u] = EnvironmentMapping(P,N,400.0f,matView);
  673.         
  674.             Vertex[ActVertex].tu = Mod.FaceList[i].T[u].X;
  675.             Vertex[ActVertex].tv = Mod.FaceList[i].T[u].Y;
  676.  
  677.         
  678.     
  679.             ActVertex = ActVertex + 1;                
  680.         }    
  681.  
  682.     }
  683.  
  684.  
  685.     //uzavri VB
  686.     g_pVB->Unlock() ;
  687.  
  688.     g_pd3dDevice->SetTexture( 0, g_pTexture );
  689.     g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  690.     g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  691.     g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  692.  
  693.     //nastav material
  694.     g_pd3dDevice->SetMaterial(&Material);
  695.  
  696.     //zapni vypni svetla
  697.     Engine.SetLighting(Lighting);
  698.  
  699.     //zapni specular ak je zapnuty
  700.     Engine.SetSpecular(Specular);
  701.  
  702.     //renderuje z VB
  703.     g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEXMODEL));
  704.     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEXMODEL);
  705.     g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, NumFaces);
  706.             
  707.     //reset to default
  708.     Engine.ResetToDefault();
  709.  
  710.  
  711. }
  712.  
  713. //------------------------------------------------------------------
  714. // Name: RenderModelMultiTexture()
  715. // Desc: Ulozi model do Vertex pola + vyrenderuje cez enviro mapping
  716. //------------------------------------------------------------------
  717. void MODEL::RenderModelMultiTexture(MODELFRAME Mod)
  718. {
  719.     
  720.     int ActVertex = 0;
  721.  
  722.     //pomocne
  723.     VECTOR3D P,N;
  724.     int u,i;
  725.     
  726.     //Vertex do ktoreho sa uklada
  727.     CUSTOMVERTEXMODEL *Vertex;
  728.  
  729.     //Otvor VB
  730.     g_pVB->Lock(0, 0, (void**)&Vertex, D3DLOCK_DISCARD|D3DLOCK_NOOVERWRITE ) ;
  731.  
  732.     //zobrazi model do pola vertexov
  733.     for (i = 0;i<NumFaces;i++)
  734.     {
  735.         for (u=0;u<3;u++)
  736.         {
  737.  
  738.             Vertex[ActVertex].pos.x = Mod.FaceList[i].P[u].X;
  739.             Vertex[ActVertex].pos.y = Mod.FaceList[i].P[u].Y;
  740.             Vertex[ActVertex].pos.z = Mod.FaceList[i].P[u].Z;
  741.  
  742.             Vertex[ActVertex].normal.x = Mod.FaceList[i].N[u].X;
  743.             Vertex[ActVertex].normal.y = Mod.FaceList[i].N[u].Y;
  744.             Vertex[ActVertex].normal.z = Mod.FaceList[i].N[u].Z;
  745.         
  746.             Vertex[ActVertex].tu = Mod.FaceList[i].T[u].X;
  747.             Vertex[ActVertex].tv = Mod.FaceList[i].T[u].Y;
  748.         
  749.             Vertex[ActVertex].color = D3DXCOLOR(Color.R,
  750.                                                 Color.G,
  751.                                                 Color.B,
  752.                                                 Color.A);
  753.  
  754.             //////////////////////
  755.             //ENVIROMENT MAPPING//
  756.             //////////////////////
  757.             P = TransformPoint(Mod.FaceList[i].P[u],Matica);
  758.             N = TransformNormal(Mod.FaceList[i].N[u],Matica);
  759.         
  760.             VECTOR2D T =  EnvironmentMapping(P,N,400.0f,matView);
  761.         
  762.             Vertex[ActVertex].tu2 = T.X;
  763.             Vertex[ActVertex].tv2 = T.Y;
  764.     
  765.     
  766.             ActVertex = ActVertex + 1;                
  767.         }    
  768.  
  769.     }
  770.  
  771.  
  772.     //uzavri VB
  773.     g_pVB->Unlock() ;
  774.  
  775.     g_pd3dDevice->SetTexture( 0,  g_pTexture );
  776.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
  777.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
  778.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  779.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
  780.  
  781.     g_pd3dDevice->SetTexture( 1,  g_pEnviroMap );
  782.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 );
  783.     //g_pd3dDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR);
  784.     //g_pd3dDevice->SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS,  D3DTTFF_COUNT3);
  785.  
  786.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_ADD );
  787.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  788.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
  789.  
  790.     //nastav material
  791.     g_pd3dDevice->SetMaterial(&Material);
  792.  
  793.     //zapni vypni svetla
  794.     Engine.SetLighting(Lighting);
  795.  
  796.     //zapni specular ak je zapnuty
  797.     Engine.SetSpecular(Specular);
  798.  
  799.     //renderuje z VB
  800.     g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEXMODEL));
  801.     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEXMODEL);
  802.     g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, NumFaces);
  803.             
  804.     //reset to default
  805.     Engine.ResetToDefault();
  806.  
  807.  
  808. }
  809.  
  810. //------------------------------------------------------------------
  811. // Name: RenderModelBumpMap()
  812. // Desc: Ulozi model do Vertex pola + vyrenderuje cez bump mapping
  813. //------------------------------------------------------------------
  814. void MODEL::RenderModelBumpMap(MODELFRAME Mod)
  815. {
  816.     
  817.     int ActVertex = 0;
  818.  
  819.     //pomocne
  820.     VECTOR3D N;
  821.     VECTOR2D T;
  822.     int u,i;
  823.     
  824.     //Vertex do ktoreho sa uklada
  825.     CUSTOMVERTEXMODEL *Vertex;
  826.  
  827.     //Otvor VB
  828.     g_pVB->Lock(0, 0, (void**)&Vertex,D3DLOCK_DISCARD|D3DLOCK_NOOVERWRITE) ;
  829.  
  830.     //zobrazi model do pola vertexov
  831.     for (i = 0;i<NumFaces;i++)
  832.     {
  833.         for (u=0;u<3;u++)
  834.         {
  835.  
  836.             Vertex[ActVertex].pos.x = Mod.FaceList[i].P[u].X;
  837.             Vertex[ActVertex].pos.y = Mod.FaceList[i].P[u].Y;
  838.             Vertex[ActVertex].pos.z = Mod.FaceList[i].P[u].Z;
  839.  
  840.             Vertex[ActVertex].normal.x = Mod.FaceList[i].N[u].X;
  841.             Vertex[ActVertex].normal.y = Mod.FaceList[i].N[u].Y;
  842.             Vertex[ActVertex].normal.z = Mod.FaceList[i].N[u].Z;
  843.         
  844.             Vertex[ActVertex].tu = Mod.FaceList[i].T[u].X;
  845.             Vertex[ActVertex].tv = Mod.FaceList[i].T[u].Y;
  846.         
  847.             Vertex[ActVertex].color = D3DXCOLOR(Color.R,
  848.                                                 Color.G,
  849.                                                 Color.B,
  850.                                                 Color.A);
  851.  
  852.             ////////////////
  853.             //BUMP MAPPING//
  854.             ////////////////
  855.             N = TransformNormal(Mod.FaceList[i].N[u],Matica);
  856.  
  857.             T = BumpMapping(N,Mod.FaceList[i].T[u],0.05f,matView);
  858.     
  859.             //suradnice pre bump map
  860.             Vertex[ActVertex].tu2 = T.X;
  861.             Vertex[ActVertex].tv2 = T.Y;
  862.  
  863.             
  864.             
  865.             ActVertex = ActVertex + 1;                
  866.         }    
  867.  
  868.     }
  869.  
  870.  
  871.     //uzavri VB
  872.     g_pVB->Unlock() ;
  873.  
  874.     ////////////////
  875.     //BUMP MAPPING//
  876.     ////////////////
  877.     g_pd3dDevice->SetTexture( 0,  g_pTexture );
  878.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
  879.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
  880.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  881.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
  882.  
  883.     g_pd3dDevice->SetTexture( 1,  g_pTexture );
  884.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 );
  885.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_SELECTARG2 );
  886.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  887.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
  888.  
  889.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_ADDSIGNED );
  890.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE | D3DTA_COMPLEMENT );
  891.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG2, D3DTA_CURRENT );
  892.     
  893.     Engine.SetBlendCustom(D3DBLEND_SRCALPHA,D3DBLEND_ZERO);
  894.  
  895.  
  896.  
  897.     //nastav material
  898.     g_pd3dDevice->SetMaterial(&Material);
  899.  
  900.     //zapni vypni svetla
  901.     Engine.SetLighting(Lighting);
  902.  
  903.     //zapni specular ak je zapnuty
  904.     Engine.SetSpecular(Specular);
  905.  
  906.     //renderuje z VB
  907.     g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEXMODEL));
  908.     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEXMODEL);
  909.     g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, NumFaces);
  910.             
  911.     //reset to default
  912.     Engine.ResetToDefault();
  913.  
  914.     //zresetuj blending
  915.     Engine.SetBlendNone();
  916.  
  917.  
  918. }
  919.  
  920.  
  921. //------------------------------------------------------------------
  922. // Name: Render()
  923. // Desc: Vyrenderuje 
  924. //------------------------------------------------------------------
  925. void MODEL::Render()
  926. {
  927.  
  928.     if (Frame >= NumFrames)
  929.             Frame = 0.0f;
  930.  
  931.     //interpoluje model podla animacie
  932.     InterpolateModel(&ModelT);
  933.  
  934.     //vypocita maticu
  935.     Matica = GetMatrix(Pos,Rot,Sca);
  936.  
  937.     //ziska polomer a minmax
  938.     CalcMinMax(&ModelT,Matica);    
  939.     
  940.     //ak model vidno renderuj ho
  941.     if ((Camera.FrustrumSphere(ModelT.Centre,ModelT.Polomer) == true) ||
  942.         (FrustrumTest == false))
  943.     {
  944.         //nastavi maticu
  945.         g_pd3dDevice->SetTransform(D3DTS_WORLD, &Matica);
  946.  
  947.         //renderuj model
  948.         if (EnviromentMapping == true)
  949.             RenderModelEnvironment(ModelT);
  950.         if (MultiTexture == true && SpecularEffects == 1)
  951.             RenderModelMultiTexture(ModelT);
  952.         else if (BumpMap == true)
  953.             RenderModelBumpMap(ModelT);
  954.         else if (OnlyShadow == true)
  955.             RenderModelOnlyShadow(ModelT);
  956.         else
  957.             RenderModelNormal(ModelT);
  958.     }
  959. }
  960.  
  961. //------------------------------------------------------------------
  962. // Name: RenderFast()
  963. // Desc: Rychle vykreslenie
  964. //------------------------------------------------------------------
  965. void MODEL::RenderFast()
  966. {
  967.  
  968.     if (Frame >= NumFrames)
  969.             Frame = 0.0f;
  970.  
  971.     //vypocita maticu
  972.     Matica = GetMatrix(Pos,Rot,Sca);
  973.  
  974.     //ziska polomer a minmax
  975.     CalcMinMax(&ModelFrame[(int)Frame],Matica);
  976.  
  977.     //ulozi min max do transformacneho modelu
  978.     ModelT.Min = ModelFrame[(int)Frame].Min;
  979.     ModelT.Max = ModelFrame[(int)Frame].Max;
  980.     ModelT.Centre = ModelFrame[(int)Frame].Centre;
  981.     ModelT.Polomer = ModelFrame[(int)Frame].Polomer;
  982.  
  983.     //ak model vidno renderuj ho
  984.     if ((Camera.FrustrumSphere(ModelT.Centre,ModelT.Polomer) == true) ||
  985.         (FrustrumTest == false))
  986.     {
  987.         //interpoluje model podla animacie
  988.         InterpolateModel(&ModelT);
  989.         
  990.         //nastavi maticu
  991.         g_pd3dDevice->SetTransform( D3DTS_WORLD, &Matica);
  992.  
  993.         //renderuj model
  994.         if (EnviromentMapping == true)
  995.             RenderModelEnvironment(ModelT);
  996.         else if (BumpMap == true)
  997.             RenderModelBumpMap(ModelT);
  998.         else
  999.             RenderModelNormal(ModelT);
  1000.     }
  1001. }
  1002.  
  1003. //------------------------------------------------------------------
  1004. // Name: CalcFaceNormals()
  1005. // Desc: Vypocita normaly
  1006. //------------------------------------------------------------------
  1007. void MODEL::CalcFaceNormals(MODELFRAME *Mod)
  1008. {
  1009.  
  1010.     VECTOR3D V1;
  1011.     VECTOR3D V2;
  1012.     VECTOR3D N;
  1013.     
  1014.     for (int i=0;i<NumFaces;i++)
  1015.     {
  1016.         //normalovy vektor
  1017.         Sub(&V1,Mod->FaceList[i].P[0],Mod->FaceList[i].P[1]);
  1018.         Sub(&V2,Mod->FaceList[i].P[2],Mod->FaceList[i].P[1]);
  1019.         Cross(&N,V1,V2);
  1020.         Normalize(&N);
  1021.  
  1022.         //kazdy vertex
  1023.         Mod->FaceList[i].N[0] = N;
  1024.         Mod->FaceList[i].N[1] = N;
  1025.         Mod->FaceList[i].N[2] = N;
  1026.  
  1027.         //vypocet plane trojholnika
  1028.         Mod->FaceList[i].Plane.Normal = N;
  1029.         Mod->FaceList[i].Plane.D = -(N.X * Mod->FaceList[i].P[1].X) 
  1030.                                    -(N.Y * Mod->FaceList[i].P[1].Y)
  1031.                                    -(N.Z * Mod->FaceList[i].P[1].Z);
  1032.  
  1033.     }
  1034.     
  1035. }
  1036. //------------------------------------------------------------------
  1037. // Name: CalcBoxPoints()
  1038. // Desc: Vypocita body krabice
  1039. //------------------------------------------------------------------
  1040. void MODEL::CalcBoxPoints(MODELFRAME *Mod)
  1041. {
  1042.     VECTOR3D Min = {10000.0f,10000.0f,10000.0f};
  1043.     VECTOR3D Max = {-10000.0f,-10000.0f,-10000.0f};
  1044.  
  1045.     for (int i=0;i<NumFaces;i++)
  1046.     {
  1047.     
  1048.         //
  1049.         //min max
  1050.         //
  1051.         for (int u=0;u<3;u++)
  1052.         {
  1053.             if (Mod->FaceList[i].P[u].X < Min.X)
  1054.                 Min.X = Mod->FaceList[i].P[u].X;
  1055.             if (Mod->FaceList[i].P[u].Y < Min.Y)
  1056.                 Min.Y = Mod->FaceList[i].P[u].Y;
  1057.             if (Mod->FaceList[i].P[u].Z < Min.Z)
  1058.                 Min.Z = Mod->FaceList[i].P[u].Z;
  1059.     
  1060.             if (Mod->FaceList[i].P[u].X > Max.X)
  1061.                 Max.X = Mod->FaceList[i].P[u].X;
  1062.             if (Mod->FaceList[i].P[u].Y > Max.Y)
  1063.                 Max.Y = Mod->FaceList[i].P[u].Y;
  1064.             if (Mod->FaceList[i].P[u].Z > Max.Z)
  1065.                 Max.Z = Mod->FaceList[i].P[u].Z;
  1066.         }
  1067.             
  1068.     }
  1069.  
  1070.     //
  1071.     //body
  1072.     //
  1073.  
  1074.     //spodna plocha
  1075.     Mod->P[0].X = Min.X;
  1076.     Mod->P[0].Y = Min.Y;
  1077.     Mod->P[0].Z = Min.Z;
  1078.  
  1079.     Mod->P[1].X = Max.X;
  1080.     Mod->P[1].Y = Min.Y;
  1081.     Mod->P[1].Z = Min.Z;
  1082.  
  1083.     Mod->P[2].X = Max.X;
  1084.     Mod->P[2].Y = Min.Y;
  1085.     Mod->P[2].Z = Max.Z;
  1086.  
  1087.     Mod->P[3].X = Min.X;
  1088.     Mod->P[3].Y = Min.Y;
  1089.     Mod->P[3].Z = Max.Z;
  1090.  
  1091.     //vrchna plocha
  1092.     Mod->P[4].X = Min.X;
  1093.     Mod->P[4].Y = Max.Y;
  1094.     Mod->P[4].Z = Min.Z;
  1095.  
  1096.     Mod->P[5].X = Max.X;
  1097.     Mod->P[5].Y = Max.Y;
  1098.     Mod->P[5].Z = Min.Z;
  1099.  
  1100.     Mod->P[6].X = Max.X;
  1101.     Mod->P[6].Y = Max.Y;
  1102.     Mod->P[6].Z = Max.Z;
  1103.  
  1104.     Mod->P[7].X = Min.X;
  1105.     Mod->P[7].Y = Max.Y;
  1106.     Mod->P[7].Z = Max.Z;
  1107. }
  1108.  
  1109.  
  1110. //------------------------------------------------------------------
  1111. // Name: CalcBoxPoints()
  1112. // Desc: Vypocita body krabice
  1113. //------------------------------------------------------------------
  1114. void MODEL::CalcMinMax(MODELFRAME *Mod,D3DXMATRIXA16 Matica)
  1115. {
  1116.     VECTOR3D Min = {10000.0f,10000.0f,10000.0f};
  1117.     VECTOR3D Max = {-10000.0f,-10000.0f,-10000.0f};
  1118.  
  1119.     VECTOR3D P[8];
  1120.  
  1121.     P[0] = TransformPoint(Mod->P[0],Matica);
  1122.     P[1] = TransformPoint(Mod->P[1],Matica);
  1123.     P[2] = TransformPoint(Mod->P[2],Matica);
  1124.     P[3] = TransformPoint(Mod->P[3],Matica);
  1125.     P[4] = TransformPoint(Mod->P[4],Matica);
  1126.     P[5] = TransformPoint(Mod->P[5],Matica);
  1127.     P[6] = TransformPoint(Mod->P[6],Matica);
  1128.     P[7] = TransformPoint(Mod->P[7],Matica);
  1129.  
  1130.     for (int i=0;i<8;i++)
  1131.     {
  1132.         //
  1133.         //min max
  1134.         //
  1135.     
  1136.         if (P[i].X < Min.X)
  1137.             Min.X = P[i].X;
  1138.         if (P[i].Y < Min.Y)
  1139.             Min.Y = P[i].Y;
  1140.         if (P[i].Z < Min.Z)
  1141.             Min.Z = P[i].Z;
  1142.     
  1143.         if (P[i].X > Max.X)
  1144.             Max.X = P[i].X;
  1145.         if (P[i].Y > Max.Y)
  1146.             Max.Y = P[i].Y;
  1147.         if (P[i].Z > Max.Z)
  1148.             Max.Z = P[i].Z;
  1149.  
  1150.             
  1151.     }
  1152.  
  1153.     //
  1154.     //uloz hodnoty
  1155.     //
  1156.  
  1157.     Mod->Centre.X = (Max.X + Min.X)/2.0f;
  1158.     Mod->Centre.Y = (Max.Y + Min.Y)/2.0f;
  1159.     Mod->Centre.Z = (Max.Z + Min.Z)/2.0f;
  1160.  
  1161.     Mod->Min = Min;
  1162.     Mod->Max = Max;
  1163.  
  1164.     Mod->Polomer = CalcDistance(Min,Mod->Centre);
  1165.     
  1166.     
  1167. }
  1168.  
  1169.  
  1170. //------------------------------------------------------------------
  1171. // Name: TransformModel()
  1172. // Desc: 
  1173. //------------------------------------------------------------------
  1174. void MODEL::TransformModel(MODELFRAME *Mod,D3DXMATRIXA16 Matica)
  1175. {
  1176.  
  1177.  
  1178.     for (int i=0;i<NumFaces;i++)
  1179.     {
  1180.         Mod->FaceList[i].P[0] = TransformPoint(Mod->FaceList[i].P[0],Matica);    
  1181.         Mod->FaceList[i].P[1] = TransformPoint(Mod->FaceList[i].P[1],Matica);    
  1182.         Mod->FaceList[i].P[2] = TransformPoint(Mod->FaceList[i].P[2],Matica);    
  1183.  
  1184.         Mod->FaceList[i].N[0] = TransformNormal(Mod->FaceList[i].N[0],Matica);    
  1185.         Mod->FaceList[i].N[1] = TransformNormal(Mod->FaceList[i].N[1],Matica);    
  1186.         Mod->FaceList[i].N[2] = TransformNormal(Mod->FaceList[i].N[2],Matica);
  1187.         
  1188.         Mod->FaceList[i].Plane = TransformPlane(Mod->FaceList[i].Plane,Matica);
  1189.     
  1190.         Mod->ZeroPoint = TransformPoint(Mod->ZeroPoint,Matica);
  1191.     }
  1192. }
  1193.  
  1194.  
  1195.  
  1196. //------------------------------------------------------------------
  1197. // Name: InterpolateModel()
  1198. // Desc: interpoluje model a posle ho do ModelT
  1199. //------------------------------------------------------------------
  1200. void MODEL::InterpolateModel(MODELFRAME *Mod)
  1201. {
  1202.     
  1203.     //dolny horny snimok
  1204.     int F1 = (int)Frame;
  1205.     int F2 = ((int)Frame) + 1;
  1206.  
  1207.     if (F2 == NumFrames)
  1208.         F2 = 0;
  1209.  
  1210.     //Interpolant
  1211.     float Int = Frame - ((float)F1);
  1212.  
  1213.     //netreba zbytocne interpolovat ak je interpolant rovny nule
  1214.     if (Int != 0.0f)
  1215.     {
  1216.     
  1217.         for (int i=0;i<NumFaces;i++)
  1218.         {
  1219.  
  1220.             for (int u=0;u<3;u++)
  1221.             {
  1222.                 Mod->FaceList[i].P[u].X = ModelFrame[F1].FaceList[i].P[u].X + (Int *(ModelFrame[F2].FaceList[i].P[u].X - ModelFrame[F1].FaceList[i].P[u].X));    
  1223.                 Mod->FaceList[i].P[u].Y = ModelFrame[F1].FaceList[i].P[u].Y + (Int *(ModelFrame[F2].FaceList[i].P[u].Y - ModelFrame[F1].FaceList[i].P[u].Y));    
  1224.                 Mod->FaceList[i].P[u].Z = ModelFrame[F1].FaceList[i].P[u].Z + (Int *(ModelFrame[F2].FaceList[i].P[u].Z - ModelFrame[F1].FaceList[i].P[u].Z));    
  1225.  
  1226.                 Mod->FaceList[i].N[u].X = ModelFrame[F1].FaceList[i].N[u].X + (Int *(ModelFrame[F2].FaceList[i].N[u].X - ModelFrame[F1].FaceList[i].N[u].X));    
  1227.                 Mod->FaceList[i].N[u].Y = ModelFrame[F1].FaceList[i].N[u].Y + (Int *(ModelFrame[F2].FaceList[i].N[u].Y - ModelFrame[F1].FaceList[i].N[u].Y));    
  1228.                 Mod->FaceList[i].N[u].Z = ModelFrame[F1].FaceList[i].N[u].Z + (Int *(ModelFrame[F2].FaceList[i].N[u].Z - ModelFrame[F1].FaceList[i].N[u].Z));    
  1229.     
  1230.                 Mod->FaceList[i].T[u].X = ModelFrame[F1].FaceList[i].T[u].X;    
  1231.                 Mod->FaceList[i].T[u].Y = ModelFrame[F1].FaceList[i].T[u].Y;    
  1232.     
  1233.             }
  1234.  
  1235.             Mod->FaceList[i].Plane.Normal.X = ModelFrame[F1].FaceList[i].Plane.Normal.X + (Int *(ModelFrame[F2].FaceList[i].Plane.Normal.X - ModelFrame[F1].FaceList[i].Plane.Normal.X));    
  1236.             Mod->FaceList[i].Plane.Normal.Y = ModelFrame[F1].FaceList[i].Plane.Normal.Y + (Int *(ModelFrame[F2].FaceList[i].Plane.Normal.Y - ModelFrame[F1].FaceList[i].Plane.Normal.Y));    
  1237.             Mod->FaceList[i].Plane.Normal.Z = ModelFrame[F1].FaceList[i].Plane.Normal.Z + (Int *(ModelFrame[F2].FaceList[i].Plane.Normal.Z - ModelFrame[F1].FaceList[i].Plane.Normal.Z));    
  1238.             Mod->FaceList[i].Plane.D = ModelFrame[F1].FaceList[i].Plane.D + (Int *(ModelFrame[F2].FaceList[i].Plane.D - ModelFrame[F1].FaceList[i].Plane.D));    
  1239.     
  1240.  
  1241.             for (u=0;u<8;u++)
  1242.             {
  1243.                 Mod->P[u] = ModelFrame[F1].P[u];
  1244.             }
  1245.         }
  1246.     
  1247.     }
  1248.  
  1249.     else  ////////
  1250.  
  1251.     {
  1252.         for (int i=0;i<NumFaces;i++)
  1253.         {
  1254.             for (int u=0;u<3;u++)
  1255.             {
  1256.                 Mod->FaceList[i].P[u] = ModelFrame[F1].FaceList[i].P[u] ;    
  1257.                 Mod->FaceList[i].N[u] = ModelFrame[F1].FaceList[i].N[u] ;    
  1258.                 Mod->FaceList[i].Plane = ModelFrame[F1].FaceList[i].Plane;    
  1259.                 Mod->FaceList[i].T[u] = ModelFrame[F1].FaceList[i].T[u];    
  1260.                 Mod->FaceList[i].T[u] = ModelFrame[F1].FaceList[i].T[u];    
  1261.     
  1262.             }
  1263.  
  1264.             for (u=0;u<8;u++)
  1265.             {
  1266.                 Mod->P[u] = ModelFrame[F1].P[u];
  1267.             }
  1268.         }
  1269.     
  1270.     }
  1271. }
  1272.  
  1273. //------------------------------------------------------------------
  1274. // Name: Smooth Shading
  1275. // Desc: vypocita smooth shading
  1276. //------------------------------------------------------------------
  1277. void MODEL::CalcSmoothShading(MODELFRAME *Mod)
  1278. {
  1279.  
  1280.     VECTOR3D *Normal = NULL;
  1281.     Normal = new VECTOR3D[NumFaces];
  1282.     
  1283.     for (int i=0;i<NumFaces;i=i+1)
  1284.     {
  1285.     for (int u=0;u<3;u=u+1)
  1286.     {
  1287.  
  1288.         //bod
  1289.         VECTOR3D B = Mod->FaceList[i].P[u];
  1290.         
  1291.         VECTOR3D NormalVys = Get3D(0.0f,0.0f,0.0f);
  1292.         int ActNormal = 0;
  1293.  
  1294.         //ziskaj normaly
  1295.         for (int j=0;j<NumFaces;j=j+1)
  1296.         {
  1297.         for (int k=0;k<3;k=k+1)
  1298.         {
  1299.             
  1300.  
  1301.             if((B.X == Mod->FaceList[j].P[k].X)  &&
  1302.                (B.Y == Mod->FaceList[j].P[k].Y)  &&
  1303.                (B.Z == Mod->FaceList[j].P[k].Z) )
  1304.             {
  1305.         
  1306.                 Normal[ActNormal] = Mod->FaceList[j].Plane.Normal ;
  1307.                 ActNormal++;
  1308.                             
  1309.             }
  1310.  
  1311.         }
  1312.         }
  1313.  
  1314.         //vypocitaj normalu
  1315.         for (int a=0;a<ActNormal;a++)
  1316.         {
  1317.             Add(&NormalVys,NormalVys,Normal[a]);
  1318.         }
  1319.         
  1320.         //normalizuj vyslednu normalu
  1321.         Normalize(&NormalVys);
  1322.  
  1323.         //zapis nove normaly
  1324.         for (j=0;j<NumFaces;j++)
  1325.         {
  1326.         for (int k=0;k<3;k++)
  1327.         {
  1328.  
  1329.             if((B.X == Mod->FaceList[j].P[k].X)  &&
  1330.                (B.Y == Mod->FaceList[j].P[k].Y)  &&
  1331.                (B.Z == Mod->FaceList[j].P[k].Z) )
  1332.             {
  1333.                 Mod->FaceList[j].N[k] = NormalVys;
  1334.             }
  1335.  
  1336.         }
  1337.         }
  1338.  
  1339.  
  1340.     }
  1341.     }
  1342.  
  1343.     if (Normal != NULL)
  1344.         delete [] Normal;
  1345.     Normal = NULL;
  1346.  
  1347.  
  1348.  
  1349. }
  1350.  
  1351.  
  1352. //------------------------------------------------------------------
  1353. // Name: SetMaterial()
  1354. // Desc: nastavy material
  1355. //------------------------------------------------------------------
  1356. void MODEL::SetMaterial(D3DMATERIAL9 Mat)
  1357. {
  1358.     Material = Mat;
  1359. }
  1360.  
  1361.  
  1362. //------------------------------------------------------------------
  1363. // Name: CollisionBox()
  1364. // Desc: Bouring box kolizia
  1365. //------------------------------------------------------------------
  1366. bool MODEL::CollisionBox(VECTOR3D P1, VECTOR3D P2,D3DXMATRIX PomMatrix)
  1367. {
  1368.  
  1369.     //transformuj body
  1370.     P1 = UnTransformPoint(P1,PomMatrix);
  1371.     P2 = UnTransformPoint(P2,PomMatrix);
  1372.  
  1373.     if (CollisionBoxEdge(P1,P2,ModelFrame[(int)Frame].P[0],ModelFrame[(int)Frame].P[6]))
  1374.         return true;
  1375.     else
  1376.         return false;
  1377.  
  1378. }
  1379.  
  1380.  
  1381. //------------------------------------------------------------------
  1382. // Name: CollisionDetail()
  1383. // Desc: detailna kolizia
  1384. //------------------------------------------------------------------
  1385. bool MODEL::CollisionDetail(VECTOR3D P1,VECTOR3D P2,D3DXMATRIX PomMatrix)
  1386. {
  1387.  
  1388.     //iba ak collision BOX == true
  1389.     if (CollisionBox(P1,P2,PomMatrix) == false)
  1390.         return false;
  1391.     else
  1392.     {
  1393.  
  1394.  
  1395.     //uhly
  1396.     float U,U1,U2,U3;
  1397.  
  1398.     //
  1399.     //testuj pre vsetky face
  1400.     //
  1401.  
  1402.  
  1403.     //transformuj body
  1404.     P1 = UnTransformPoint(P1,PomMatrix);
  1405.     P2 = UnTransformPoint(P2,PomMatrix);
  1406.  
  1407.     VECTOR3D Inter; //priesecnik
  1408.  
  1409.     for (int i=0;i<NumFaces;i++)
  1410.     {
  1411.  
  1412.         if (CalcPriesEdge(&Inter,ModelFrame[(int)Frame].FaceList[i].Plane,P1,P2) == true)
  1413.         {
  1414.             
  1415.             U1 = CalcAngleCentre(Inter,ModelFrame[(int)Frame].FaceList[i].P[0],
  1416.                                        ModelFrame[(int)Frame].FaceList[i].P[1]);
  1417.             U2 = CalcAngleCentre(Inter,ModelFrame[(int)Frame].FaceList[i].P[1],
  1418.                                        ModelFrame[(int)Frame].FaceList[i].P[2]);
  1419.             U3 = CalcAngleCentre(Inter,ModelFrame[(int)Frame].FaceList[i].P[2],
  1420.                                        ModelFrame[(int)Frame].FaceList[i].P[0]);
  1421.  
  1422.             U = U1+U2+U3;
  1423.  
  1424.             if (U > 6.2f && U < 6.35f)
  1425.             {
  1426.                 ColPosition = TransformPoint(Inter,PomMatrix);
  1427.                 ColNormal = TransformNormal(ModelFrame[(int)Frame].FaceList[i].Plane.Normal,PomMatrix);
  1428.             
  1429.                 return true;
  1430.             }
  1431.         }
  1432.     }
  1433.  
  1434.     return false;
  1435.  
  1436.     }
  1437.  
  1438. }
  1439.  
  1440. //------------------------------------------------------------------
  1441. // Name: LoadMD2
  1442. // Desc: Nacita MD2 model
  1443. //------------------------------------------------------------------
  1444. void MODEL::LoadMD2(char *FileName,int NFrames)
  1445. {
  1446.  
  1447.     //info pre Log
  1448.     char cBuf[80];
  1449.     LogPrint("Inicializujem MD2 model");
  1450.     sprintf(cBuf,"  Subor: %s",FileName);
  1451.     
  1452.  
  1453.     FILE *File = NULL;  //subor z ktoreho sa bude citat
  1454.  
  1455.     tMd2Header m_Header;
  1456.  
  1457.     ////////////////
  1458.     //otvori subor//
  1459.     ////////////////
  1460.     File = fopen(FileName, "rb");
  1461.     if (File == NULL)
  1462.         LogPrint("  Subor sa nenasiel");
  1463.  
  1464.  
  1465.     ////////////////////
  1466.     //nacitaj hlavicku//
  1467.     ////////////////////
  1468.     fread(&m_Header, 1, sizeof(tMd2Header), File);
  1469.     
  1470.     NumFaces = m_Header.numTriangles;
  1471.     NumFrames = NFrames;
  1472.  
  1473.     //info pre log
  1474.     sprintf(cBuf,"  Pocet snimkov: %d",m_Header.numFrames);
  1475.     LogPrint(cBuf);
  1476.     sprintf(cBuf,"  Pocet vertex: %d",m_Header.numVertices);
  1477.     LogPrint(cBuf);
  1478.     sprintf(cBuf,"  Pocet trojholnikov: %d",m_Header.numTriangles);
  1479.     LogPrint(cBuf);
  1480.  
  1481.  
  1482.     /////////////////////////
  1483.     //inicializacia modelov//
  1484.     /////////////////////////
  1485.  
  1486.     //vytvori zasobnik modelov
  1487.     ModelFrame = new MODELFRAME [NumFrames];
  1488.  
  1489.     //inicializuje zasobnik modelov
  1490.     for (int i=0;i<NumFrames;i++)
  1491.     {
  1492.         InitializeModel(&ModelFrame[i],NumFaces);
  1493.     }
  1494.  
  1495.     //inicializuje transformovany model
  1496.     InitializeModel(&ModelT,NumFaces);
  1497.  
  1498.     ////////////////////////////
  1499.     //vytvaranie vertex buffer//
  1500.     ////////////////////////////
  1501.  
  1502.     if (FAILED(g_pd3dDevice->CreateVertexBuffer(NumFaces*3*sizeof(CUSTOMVERTEXMODEL),
  1503.                                    D3DUSAGE_WRITEONLY|D3DUSAGE_DYNAMIC, D3DFVF_CUSTOMVERTEXMODEL,
  1504.                                    D3DPOOL_DEFAULT, &g_pVB, NULL )))
  1505.       {
  1506.         LogPrint("  Chyba pri vytvarani VB");
  1507.     }
  1508.     else
  1509.     {
  1510.         LogPrint("  Vertex Buffer vytvoreny");
  1511.     }
  1512.  
  1513.     ///////////////////////////////////
  1514.     //veci potrebne pre nacitanie MD2//
  1515.     ///////////////////////////////////
  1516.     unsigned char buffer[MD2_MAX_FRAMESIZE];
  1517.  
  1518.     tMd2Skin *m_pSkins         = new tMd2Skin [m_Header.numSkins];
  1519.     tMd2TexCoord *m_pTexCoords = new tMd2TexCoord [m_Header.numTexCoords];
  1520.     tMd2Face *m_pTriangles     = new tMd2Face [m_Header.numTriangles];
  1521.     tMd2Frame *m_pFrames       = new tMd2Frame [m_Header.numFrames];
  1522.  
  1523.  
  1524.     //////////////////////
  1525.     //Nacitavanie udajov//
  1526.     //////////////////////
  1527.     
  1528.     fseek(File, m_Header.offsetSkins, SEEK_SET);
  1529.     fread(m_pSkins, sizeof(tMd2Skin), m_Header.numSkins, File);
  1530.     
  1531.     fseek(File, m_Header.offsetTexCoords, SEEK_SET);
  1532.     fread(m_pTexCoords, sizeof(tMd2TexCoord), m_Header.numTexCoords, File);
  1533.  
  1534.     fseek(File, m_Header.offsetTriangles, SEEK_SET);
  1535.     fread(m_pTriangles, sizeof(tMd2Face), m_Header.numTriangles, File);
  1536.             
  1537.     fseek(File, m_Header.offsetFrames, SEEK_SET);
  1538.  
  1539.     for (i=0; i < m_Header.numFrames; i++)
  1540.     {
  1541.         // Assign our alias frame to our buffer memory
  1542.         tMd2AliasFrame *pFrame = (tMd2AliasFrame *) buffer;
  1543.  
  1544.         // Allocate the memory for the first frame of animation's vertices
  1545.         m_pFrames[i].pVertices = new tMd2Triangle [m_Header.numVertices];
  1546.  
  1547.         // Read in the first frame of animation
  1548.         fread(pFrame, 1, m_Header.frameSize, File);
  1549.  
  1550.         // Store off a vertex array pointer to cut down large lines of code
  1551.         tMd2Triangle *pVertices = m_pFrames[i].pVertices;
  1552.         
  1553.         // Go through all of the number of vertices and assign the scale and translations.
  1554.         // Store the vertices in our current frame's vertex list array, while swapping Y and Z.
  1555.         // Notice we also negate the Z axis as well to make the swap correctly.
  1556.         for (int j=0; j < m_Header.numVertices; j++)
  1557.         {
  1558.             pVertices[j].vertex[0] = pFrame->aliasVertices[j].vertex[0] * pFrame->scale[0] + pFrame->translate[0];
  1559.             pVertices[j].vertex[2] = -1 * (pFrame->aliasVertices[j].vertex[1] * pFrame->scale[1] + pFrame->translate[1]);
  1560.             pVertices[j].vertex[1] = pFrame->aliasVertices[j].vertex[2] * pFrame->scale[2] + pFrame->translate[2];
  1561.         }
  1562.     }
  1563.  
  1564.  
  1565.     fclose(File);
  1566.  
  1567.     /////////////////
  1568.     //Konvertovanie// 
  1569.     /////////////////
  1570.     //opakuj pre kazdy frame
  1571.     for (i=0;i<NFrames;i++)
  1572.     {
  1573.  
  1574.         //pre vsetky trojholniky vo frame
  1575.         for (int u=0;u<m_Header.numTriangles;u++)
  1576.         {
  1577.             int V1,V2,V3; //index vertexov
  1578.             int T1,T2,T3; //index texturovych kordinatov
  1579.  
  1580.  
  1581.             V1 = m_pTriangles[u].vertexIndices[0];
  1582.             V2 = m_pTriangles[u].vertexIndices[1];
  1583.             V3 = m_pTriangles[u].vertexIndices[2];
  1584.  
  1585.             T1 = m_pTriangles[u].textureIndices[0];
  1586.             T2 = m_pTriangles[u].textureIndices[1];
  1587.             T3 = m_pTriangles[u].textureIndices[2];
  1588.  
  1589.             ModelFrame[i].FaceList[u].P[2].X =     m_pFrames[i].pVertices[V1].vertex[0];        
  1590.             ModelFrame[i].FaceList[u].P[2].Y =     m_pFrames[i].pVertices[V1].vertex[1];    
  1591.             ModelFrame[i].FaceList[u].P[2].Z =     m_pFrames[i].pVertices[V1].vertex[2];
  1592.             ModelFrame[i].FaceList[u].T[2].X =     m_pTexCoords[T1].u/float(m_Header.skinWidth) ;        
  1593.             ModelFrame[i].FaceList[u].T[2].Y =     m_pTexCoords[T1].v/float(m_Header.skinHeight);
  1594.  
  1595.             ModelFrame[i].FaceList[u].P[1].X =     m_pFrames[i].pVertices[V2].vertex[0];        
  1596.             ModelFrame[i].FaceList[u].P[1].Y =     m_pFrames[i].pVertices[V2].vertex[1];    
  1597.             ModelFrame[i].FaceList[u].P[1].Z =     m_pFrames[i].pVertices[V2].vertex[2];
  1598.             ModelFrame[i].FaceList[u].T[1].X =     m_pTexCoords[T2].u/float(m_Header.skinWidth);        
  1599.             ModelFrame[i].FaceList[u].T[1].Y =     m_pTexCoords[T2].v/float(m_Header.skinHeight);
  1600.  
  1601.             ModelFrame[i].FaceList[u].P[0].X =     m_pFrames[i].pVertices[V3].vertex[0];        
  1602.             ModelFrame[i].FaceList[u].P[0].Y =     m_pFrames[i].pVertices[V3].vertex[1];    
  1603.             ModelFrame[i].FaceList[u].P[0].Z =     m_pFrames[i].pVertices[V3].vertex[2];
  1604.             ModelFrame[i].FaceList[u].T[0].X =     m_pTexCoords[T3].u/float(m_Header.skinWidth);        
  1605.             ModelFrame[i].FaceList[u].T[0].Y =     m_pTexCoords[T3].v/float(m_Header.skinHeight);
  1606.  
  1607.         }
  1608.  
  1609.         //vypocitajminmax
  1610.         CalcBoxPoints(&ModelFrame[i]);
  1611.  
  1612.         //vypocitaj normaly
  1613.         if (Normals == true)
  1614.             CalcFaceNormals(&ModelFrame[i]);
  1615.  
  1616.         //vypocitaj smooth shading
  1617.         if (SmoothShading == true)
  1618.             CalcSmoothShading(&ModelFrame[i]);
  1619.  
  1620.     }
  1621.  
  1622.                             
  1623.  
  1624. }
  1625.  
  1626. //------------------------------------------------------------------
  1627. // Name: SaveSHD
  1628. // Desc: Ulozi model ako SHD
  1629. //------------------------------------------------------------------
  1630. void MODEL::SaveSHD(char *FileName)
  1631. {
  1632.  
  1633.     //struktury pre zapis
  1634.     Shd_Header Header;
  1635.     Shd_Face Face;
  1636.  
  1637.     //subor
  1638.     FILE *File;
  1639.     File = fopen(FileName,"wb");
  1640.  
  1641.     //nastavy header
  1642.     Header.NumFaces = NumFaces;
  1643.     Header.NumFrames = NumFrames;
  1644.     Header.Version = 1;
  1645.  
  1646.     //zapis header
  1647.     fwrite(&Header,sizeof(Header),1,File);
  1648.  
  1649.     //zapise pole
  1650.     for (int i=0;i<NumFrames;i++)
  1651.     {
  1652.         for (int u=0;u<NumFaces;u++)
  1653.         {
  1654.  
  1655.             Face.Vertex[0].P[0] = ModelFrame[i].FaceList[u].P[0].X;
  1656.             Face.Vertex[0].P[1] = ModelFrame[i].FaceList[u].P[0].Y;
  1657.             Face.Vertex[0].P[2] = ModelFrame[i].FaceList[u].P[0].Z;
  1658.             Face.Vertex[0].N[0] = ModelFrame[i].FaceList[u].N[0].X;
  1659.             Face.Vertex[0].N[1] = ModelFrame[i].FaceList[u].N[0].Y;
  1660.             Face.Vertex[0].N[2] = ModelFrame[i].FaceList[u].N[0].Z;
  1661.             Face.Vertex[0].T[0] = ModelFrame[i].FaceList[u].T[0].X;
  1662.             Face.Vertex[0].T[1] = ModelFrame[i].FaceList[u].T[0].Y;
  1663.  
  1664.             Face.Vertex[1].P[0] = ModelFrame[i].FaceList[u].P[1].X;
  1665.             Face.Vertex[1].P[1] = ModelFrame[i].FaceList[u].P[1].Y;
  1666.             Face.Vertex[1].P[2] = ModelFrame[i].FaceList[u].P[1].Z;
  1667.             Face.Vertex[1].N[0] = ModelFrame[i].FaceList[u].N[1].X;
  1668.             Face.Vertex[1].N[1] = ModelFrame[i].FaceList[u].N[1].Y;
  1669.             Face.Vertex[1].N[2] = ModelFrame[i].FaceList[u].N[1].Z;
  1670.             Face.Vertex[1].T[0] = ModelFrame[i].FaceList[u].T[1].X;
  1671.             Face.Vertex[1].T[1] = ModelFrame[i].FaceList[u].T[1].Y;
  1672.  
  1673.             Face.Vertex[2].P[0] = ModelFrame[i].FaceList[u].P[2].X;
  1674.             Face.Vertex[2].P[1] = ModelFrame[i].FaceList[u].P[2].Y;
  1675.             Face.Vertex[2].P[2] = ModelFrame[i].FaceList[u].P[2].Z;
  1676.             Face.Vertex[2].N[0] = ModelFrame[i].FaceList[u].N[2].X;
  1677.             Face.Vertex[2].N[1] = ModelFrame[i].FaceList[u].N[2].Y;
  1678.             Face.Vertex[2].N[2] = ModelFrame[i].FaceList[u].N[2].Z;
  1679.             Face.Vertex[2].T[0] = ModelFrame[i].FaceList[u].T[2].X;
  1680.             Face.Vertex[2].T[1] = ModelFrame[i].FaceList[u].T[2].Y;
  1681.     
  1682.             Face.Normal[0] = ModelFrame[i].FaceList[u].Plane.Normal.X;
  1683.             Face.Normal[1] = ModelFrame[i].FaceList[u].Plane.Normal.Y;
  1684.             Face.Normal[2] = ModelFrame[i].FaceList[u].Plane.Normal.Z;
  1685.             Face.D         = ModelFrame[i].FaceList[u].Plane.D;
  1686.  
  1687.             fwrite(&Face,sizeof(Face),1,File);
  1688.  
  1689.         }
  1690.     }
  1691.  
  1692.  
  1693.     //zavri subor
  1694.     fclose(File);
  1695.  
  1696. }
  1697.  
  1698. //------------------------------------------------------------------
  1699. // Name: LoadSHD
  1700. // Desc: Loadne SHD model
  1701. //------------------------------------------------------------------
  1702. void MODEL::LoadSHD(char *FileName)
  1703. {
  1704.  
  1705.     //log
  1706.     char cBuf[80];
  1707.     LogPrint("Inicializujem SHD subor");
  1708.     sprintf(cBuf,"  Subor: %s",FileName);
  1709.     LogPrint(cBuf);
  1710.  
  1711.     //struktury pre citanie
  1712.     Shd_Header Header;
  1713.     Shd_Face Face;
  1714.  
  1715.     /////////
  1716.     //subor//
  1717.     /////////
  1718.     FILE *File = NULL;
  1719.     File = fopen(FileName,"rb");
  1720.     if (File == NULL)
  1721.         LogPrint("  Subor sa nenasiel");
  1722.  
  1723.     ////////////////////
  1724.     //precita hlavicku//
  1725.     ////////////////////
  1726.     fread(&Header,sizeof(Header),1,File);
  1727.  
  1728.     ////////////////////
  1729.     //nastavy premenne//
  1730.     ////////////////////
  1731.     NumFaces = Header.NumFaces;
  1732.     NumFrames = Header.NumFrames;
  1733.  
  1734.     sprintf(cBuf,"  Pocet trojholnikov: %d",NumFaces);
  1735.     LogPrint(cBuf);
  1736.  
  1737.     sprintf(cBuf,"  Pocet snimkov: %d",NumFrames);
  1738.     LogPrint(cBuf);
  1739.  
  1740.     /////////////////////////
  1741.     //inicializacia modelov//
  1742.     /////////////////////////
  1743.  
  1744.     //vytvori zasobnik modelov
  1745.     ModelFrame = new MODELFRAME [NumFrames];
  1746.  
  1747.     //inicializuje zasobnik modelov
  1748.     for (int i=0;i<NumFrames;i++)
  1749.     {
  1750.         InitializeModel(&ModelFrame[i],NumFaces);
  1751.     }
  1752.  
  1753.     //inicializuje transformovany model
  1754.     InitializeModel(&ModelT,NumFaces);
  1755.  
  1756.     ////////////////////////////
  1757.     //vytvaranie vertex buffer//
  1758.     ////////////////////////////
  1759.  
  1760.     if (FAILED(g_pd3dDevice->CreateVertexBuffer(NumFaces*3*sizeof(CUSTOMVERTEXMODEL),
  1761.                                    D3DUSAGE_WRITEONLY|D3DUSAGE_DYNAMIC, D3DFVF_CUSTOMVERTEXMODEL,
  1762.                                    D3DPOOL_DEFAULT, &g_pVB, NULL )))
  1763.       {
  1764.         LogPrint("  Chyba pri vytvarani VB");
  1765.     }
  1766.     else
  1767.     {
  1768.         LogPrint("  Vertex Buffer vytvoreny");
  1769.     }
  1770.  
  1771.     /////////////////
  1772.     //Konvertovanie// 
  1773.     /////////////////
  1774.     for (i=0;i<NumFrames;i++)
  1775.     {
  1776.         for (int u=0;u<NumFaces;u++)
  1777.         {
  1778.             fread(&Face,sizeof(Face),1,File);
  1779.  
  1780.             ModelFrame[i].FaceList[u].P[0].X = Face.Vertex[0].P[0];
  1781.             ModelFrame[i].FaceList[u].P[0].Y = Face.Vertex[0].P[1];
  1782.             ModelFrame[i].FaceList[u].P[0].Z = Face.Vertex[0].P[2];
  1783.             ModelFrame[i].FaceList[u].N[0].X = Face.Vertex[0].N[0];
  1784.             ModelFrame[i].FaceList[u].N[0].Y = Face.Vertex[0].N[1];
  1785.             ModelFrame[i].FaceList[u].N[0].Z = Face.Vertex[0].N[2];
  1786.             ModelFrame[i].FaceList[u].T[0].X = Face.Vertex[0].T[0] ;
  1787.             ModelFrame[i].FaceList[u].T[0].Y = Face.Vertex[0].T[1];
  1788.  
  1789.             ModelFrame[i].FaceList[u].P[1].X = Face.Vertex[1].P[0];
  1790.             ModelFrame[i].FaceList[u].P[1].Y = Face.Vertex[1].P[1];
  1791.             ModelFrame[i].FaceList[u].P[1].Z = Face.Vertex[1].P[2];
  1792.             ModelFrame[i].FaceList[u].N[1].X = Face.Vertex[1].N[0];
  1793.             ModelFrame[i].FaceList[u].N[1].Y = Face.Vertex[1].N[1];
  1794.             ModelFrame[i].FaceList[u].N[1].Z = Face.Vertex[1].N[2] ;
  1795.             ModelFrame[i].FaceList[u].T[1].X = Face.Vertex[1].T[0];
  1796.             ModelFrame[i].FaceList[u].T[1].Y = Face.Vertex[1].T[1];
  1797.  
  1798.             ModelFrame[i].FaceList[u].P[2].X = Face.Vertex[2].P[0];
  1799.             ModelFrame[i].FaceList[u].P[2].Y = Face.Vertex[2].P[1];
  1800.             ModelFrame[i].FaceList[u].P[2].Z = Face.Vertex[2].P[2];
  1801.             ModelFrame[i].FaceList[u].N[2].X = Face.Vertex[2].N[0];
  1802.             ModelFrame[i].FaceList[u].N[2].Y = Face.Vertex[2].N[1];
  1803.             ModelFrame[i].FaceList[u].N[2].Z = Face.Vertex[2].N[2];
  1804.             ModelFrame[i].FaceList[u].T[2].X = Face.Vertex[2].T[0];
  1805.             ModelFrame[i].FaceList[u].T[2].Y = Face.Vertex[2].T[1];
  1806.     
  1807.             ModelFrame[i].FaceList[u].Plane.Normal.X = Face.Normal[0];
  1808.             ModelFrame[i].FaceList[u].Plane.Normal.Y = Face.Normal[1];
  1809.             ModelFrame[i].FaceList[u].Plane.Normal.Z = Face.Normal[2];
  1810.             ModelFrame[i].FaceList[u].Plane.D = Face.D;
  1811.         
  1812.  
  1813.         }
  1814.  
  1815.         //vypocitaj min max pre kazdy snimok
  1816.         CalcBoxPoints(&ModelFrame[i]);
  1817.     }
  1818.     
  1819.  
  1820.     //zavri subor
  1821.     fclose(File);
  1822.  
  1823. }
  1824.  
  1825. //------------------------------------------------------------------
  1826. // Name: BuildShadow()
  1827. // Desc: urobi tien do stencil class
  1828. //------------------------------------------------------------------
  1829. void MODEL::BuildShadow(STENCIL *Stn)
  1830. {
  1831.  
  1832.     //nastavi maticu
  1833.     g_pd3dDevice->SetTransform( D3DTS_WORLD, &Matica);
  1834.  
  1835.     //transformuje svetlo do priestoru modelu
  1836.     VECTOR3D LightPos = UnTransformPoint(Stn->LightPosition,Matica);
  1837.         
  1838.     for (int i=0;i<ModelT.NumFaces;i++)
  1839.     {
  1840.         
  1841.         //ak je face otoceny k svetlu vynechaj
  1842.         if (( ModelT.FaceList[i].Plane.Normal.X*LightPos.X + 
  1843.               ModelT.FaceList[i].Plane.Normal.Y*LightPos.Y + 
  1844.               ModelT.FaceList[i].Plane.Normal.Z*LightPos.Z + 
  1845.               ModelT.FaceList[i].Plane.D) <= 0.0f)
  1846.               continue;
  1847.  
  1848.         Stn->AddEdge(ModelT.FaceList[i].P[0],ModelT.FaceList[i].P[1]);
  1849.         Stn->AddEdge(ModelT.FaceList[i].P[1],ModelT.FaceList[i].P[2]);
  1850.         Stn->AddEdge(ModelT.FaceList[i].P[2],ModelT.FaceList[i].P[0]);
  1851.           
  1852.     }
  1853.  
  1854.     //vyberie quady ktore su nakraji
  1855.     Stn->ProcessEdge(LightPos);
  1856.  
  1857.     //vyrenderuje hotovy tien
  1858.     Stn->RenderShadow();
  1859.  
  1860. }